1602不能显示中文,因为不带中文字库
但可以自定义字符,用取模软件取模后写入1602再显示出自定义字符或图案
不过实际做起来非常不适合显示汉字,因为点数太少效果太难看
如果LZ非要显示汉字不可,建议使用12864等液晶
这个是经过编译成功的程序,看看什么样:
#include "1602h"
#include "defh"
/端口定义/
#define uchar unsigned char
#define uint unsigned int
unsigned char code String1[] ="The first alarm ";
unsigned char code String2[] ="The second alarm";
unsigned char code String3[] ="The third alarm ";
void main(void)
{
LCD_init();
TMOD |= 0X01;
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;
ET0 = 1;
EA = 1;
while(1) {
if(Ctr1 == 0 || Ctr2 == 0 || Ctr3 ==0) {
if(Ctr1 == 0) {
LCD_string(0, String1);
LED = ON;
BEEP = ON;
TR0 = 1;
}
if(Ctr2 == 0) {
LCD_string(0, String2);
LED = ON;
BEEP = ON;
TR0 =1;
}
if(Ctr3 == 0) {
LCD_string(0, String3);
LED = ON;
BEEP = ON;
TR0 = 1;
}
}
}
}
void timer0() interrupt 1
{
uchar tt;
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;
tt++;
if(tt == 20) {
tt = 0;
LED = OFF;
BEEP = OFF;
TR0 = 0;
}
}
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]'STC89C52RC'!;//这边错了
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--);
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcday=1;
delay(5);
lcden=0;
}
viod write_data(uchar date)//这个write_data函数只能写一个字节
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void main();
{
init();
write_com(0x80);
for(num=0;num<11;num++)
{
write_data(STC89C52RC);//write_data只能写一个字节,这边错了,还有如果要写单个字节,如果是字母的话,还得加引号
//如果要写一个字符串,可以另外写个函数
delay(5);
}
while(1)
}
我有 at89s52 的键盘 和1602初始化程序,你可以组装一下,
STC12C5A08AD单片机和at89s52 差不多。
#include<at89x52h>
#include<intrinsh>
sbit d_i=P1^0;
sbit r_w=P1^1;
sbit e=P1^2;
#define uchar unsigned char
#define nop _nop_()
void delay(unsigned int ttt) // 长延时,ttt为延时的mS数
{
unsigned int aaa;
while(ttt--) // 延时约1mS
{
aaa=89;
while(aaa--);
}
}
void wcom(uchar cmd);
void wddr(uchar dat);
void checkbusy();
void lcd_init();
void display();
void main()
{
delay(40);
lcd_init();
while(1){
display();}
}
void lcd_init()
{
delay(15);
wcom(0x01);
delay(5);
wcom(0x38);
delay(5);
wcom(0x38);
delay(10);
wcom(0x0c);
delay(5);
wcom(0x06);
delay(5);
wcom(0x01);
delay(5);
}
void wcom(uchar cmd)
{
checkbusy();
d_i=0;
r_w=0;
e=0;
P0=cmd;
nop;
nop;
nop;
nop;
e=1;
nop;
nop;
nop;
nop;e=0;
}
void wddr (uchar dat)
{
checkbusy();
d_i=1;
r_w=0;
e=0;
P0=dat;
nop;nop;
nop;nop;
e=1;
nop;nop;
nop;nop;
e=0;
}
void checkbusy ()
{ bit result;
d_i=0;
r_w=1;
P0=0xff;
e=0;
nop;nop;
e=1;
nop;
nop;nop;
nop;
do {delay(1);
result = (bit)(P0&0x80);}
while(result!=0);
e=0;}
void display()
{// wcom(0x80);
wddr(0x61);
delay(100);
}
/取键值函数/
uchar keyscan()
{
uchar hang=0x00,lie=0x01,i=0x00;
uchar lcode,hcode;
uchar keynumber=0xff;
P2=0xf0;
if((P2&0xf0)!=0xf0)
{
delay(15); //去抖动
if((P2&0xf0)!=0xf0)
{
hcode=0xfe; //从第一行开始查
while((hcode&0x10)!=0)
{ P2=hcode;
if((P2&0xf0)!=0xf0)
{
lcode=(P2&0xf0)|0x0f;
//nop;nop;nop;nop;
//shortdelay(2);
lcode=(~lcode)>>4;
while(lie!=lcode) //判断在第几列(通过移动到某一位,是否匹配)
{ lie=lie<<1; //变量移动后要赋值
i++;
}
lie=i;
keynumber=hang4+lie;// 键值
//shortdelay(5); //开始程序不健壮,加上延时就可以稳定显示了,现在去掉也没问题
// nop;nop;nop;nop;
return (keynumber);
//break; //当初以为返回值后,不能跳出故加上;现在也可去掉
}
else
{
hcode=(hcode<<1)|0x01;
hang++;//下一次扫描第hang行,行值
}
}
}
}
else return (keynumber);
}
所有人回答的都不对,其实是忘了将1602第5脚rw设置为0了,而郭天祥的板子是直接接地,所以不用设置,但是别的板子却不能照搬了。所以程序应改为
sbit lcdrw=P3^6;
void write_com(uchar com)
{
lcdrs=0;
lcdrw=0;//加这一条
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
lcdrw=0;//加这一条
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
以上就是关于给个单片机液晶1602显示汉字“邓肖”的程序全部的内容,包括:给个单片机液晶1602显示汉字“邓肖”的程序、高手指导一下:编写程序单片机报警并且用1602液晶显示。如何调用、怎样在STC89C51单片机上用1602液晶显示字符“STC89C52RC”,求程序代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)