有12864单独显示汉字的程序,可以在四行显示汉字,经过实验好用;有一个秒表的程序,是用数码管显示的,也是成功的,就是不知道如何将这两个融合在一起,试了好几次都不能显示。不知道错在哪了。。。
#include
#include
#defineuintunsigned int
#defineuchar unsigned char
uchar shu=0;//定义全局变量
#pragma interrupt_handler miao:9
void lcd_init();//LCD初始化函数
void writedata(uchar);//向LCD写数据
void busy_check(void);//检测LCD是否忙
void writecommand(uchar);//向LCD写命令
void lcdtextout(uchar address,uchar shu);//向指定的地址写字符串
void setxy(uchar x,uchar y);//设定显存地址
void busy_check(void)
{
DDRB=0x00;
PORTA&=~BIT(0); //RS-0
PORTA|=BIT(1);
//RW-1
PORTA|=BIT(2);
//E-1
asm("nop");//*****重要:不同编译器效率不一样
while((PINB&0x80)!=0x00);//检测P7是否有数据输出,不=0,忙,就在内部循环,==0就让B口输出,输出完使E=0,为下一次检测做好准备
DDRB=0xff;
PORTA&=~BIT(2);
//E=0 */
}
//*************************写命令函数*****************************//
void writecommand(uchar data)
{
busy_check();
PORTA&=~BIT(0); //RS-0
PORTA&=~BIT(1); //RW-0
PORTA|=BIT(2); //E=1
PORTB=data;
PORTA&=~BIT(2);
//E=0
}
//******************************写数据函数****************************//
void writedata(uchar data)
{
busy_check();
PORTA|=BIT(0);
//RS-1
PORTA&=~BIT(1);
//RW-0
PORTA|=BIT(2); //E=1
PORTB=data;
PORTA&=~BIT(2);
//E=0
}
void lcd_init(void)
{
writecommand(0x30); //选择基本指令集
writecommand(0x30);//选择8bit数据流
writecommand(0x0c);//开显示(无游标、不反白)
writecommand(0x01);//清除显示,并且设定地址指针为00H
writecommand(0x06);//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
}
void lcdtextout(uchar address,uchar shu)
{
writecommand(0x80+address);
while(shu)
{
writedata(shu);
}
}
//***************************设置坐标*****************************//
void setxy(uchar x,uchar y)
{
writecommand(0x36); //功能设置 扩充指令 直接显示
writecommand(y);
//Y地址设置
writecommand(x);
//X地址设置
}
void miao()
{
if(shu==60);
shu=0;
shu++;
TCNT1H=0x85;
TCNT1L=0xed;
}
void main()
{
uint i=65535;
DDRB=0xff;
DDRA=0xff;
lcd_init();
TCCR1B=0x04;//256分频
TCNT1H=0x85;
TCNT1L=0xed;//8M/256=31250,31250-65535=34285,转换为16进制为85ED,所以H是85,L是ED
TIMSK|=BIT(2);//中断屏蔽寄存器,不用管
SREG|=BIT(7);//开启总中断,不然不会执行中断
while(1)
{
lcdtextout(0,shu/10);
lcdtextout(16,shu%10);
}
}
|