注释非常详细单片机驱动的12864源程序如下:
#include
#include<12864.h>
#define uchar unsigned char
#define uint unsigned int
uchar dis[110];
uchar a;
void delay1ms(uint xms)
{
unsigned int i,j;
for(i=xms;i>0;i--) /*或for(i=xms;i<0;i++)*/
for(j=110;j>0;j--); /*for(j=110;j<0;j++); 总循环数=xms*110*/
}
void uart_int(void)
{
SCON=0x50; // SCON=0x50是SM1=1和REN=1,设置串口方式1且允许串口接收。
//一般配合TMOD=0x20作串口中断程序初始化。
PCON=0x00; // 是设置波特率不加倍(0x80加倍)
TMOD=0x20; // 是设置波特率发生器为定时器2为8位自动重装载模式
TH1 =0xFD;
TL1 =0xFD; /*SMOD是特殊功能寄存器PCON的第7位,可以控制波特率的,SMOD=1时串口通讯的波特率倍增, 为0时波特率不倍增。
SMOD=0时:参数=256-fsoc/12/32/波特率; SMOD=1时:参数=256-fsoc/12/16/波特率:
12M晶振或11.0592M晶振的情况下,当SMOD=0时,9600波特率的参数是0xfd,当SMOD=1时,9600波特率的参数是0xfa。
一个机器周期=12个时钟周期
系统时钟进入串行波特率发生模块后,会进行32分频 ,
如果你通过寄存器设置波特率倍增的话,这个32分频就会改为16分频。
分频:主要是为了在内核频率与串口波特率之间找一个平衡,同时传统51也要设法降低时钟树上外设部分的工作频率、才能控制住功耗。*/
TR1 =1; // 是开启定时器1
EA=1; // 是开启总中断。
ES=1; //是开启串口中断;
}
void display(unsigned char *p)//显示
{
while(*p!=') /*'是空格,一般是字符串的结束标志,指针变量不等于‘/0’不会跳出循环*/
{
write_dat(*p++); /*调用函数:写显示数据到LCD,将数组中的所有字符一个个地显示在液晶屏幕上*/
delay1ms(1);
}
}
void serve() interrupt 4
{
dis[a++]=SBUF; /*单片机自动将串行数据接收缓冲器中的数据取走给table[n]*/
RI=0; /*RI字面是接收中断的意思,是串口接收中断标志,当RI=1时表示串口接收完成,
SBUF中保存好了接收的数据,此时申请中断,如果ES=1,就进入中断服务程序了。*/
}
void main()
{
uart_int(); /*调用中断初始化函数*/
lcd_init(); /*调用leo初始化函数*/
while(1)
{
write_cmd(0x98);
write_cmd(0x90); /*写指令到第二行地址:串行数据显示的位置*/
write_cmd(0x88);
write_cmd(0x80);
display(dis); /*调用dispiay函数:将table的数组中输入的所有字符一个个地显示在液晶屏幕上*/
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』