flag++;
if(flag==20)
{ miao++;
flag=0;
write_sfm(10,miao);
if(miao==60)
{ fen++;
miao=0;
write_sfm(10,miao);
write_sfm(7,fen);
if(fen==60)
{ shi++;
fen=0;
write_sfm(7,fen);
write_sfm(4,shi);
if(shi==24)
{ shi=0;
write_sfm(4,shi);}
}
}
}
}
这是我使用郭天祥的TX-1c开发板写的,你值要求从定时器读到液晶,这个我没有,我把我写的液晶显示时间的程序给你,也使用了定时器来跑时间,做个参考吧,也只有C程序了。
希望我的回答能帮助到你。
#include <stringh>
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
sbit DATA=P2; //定义LCD1602管脚
void lcd1602_display_str(unsigned char x,bit y,unsigned char dat[]); //x:列 0-15 y:行 0-1 dat写入的东西
void lcd1602_display_byte(unsigned char x,bit y,unsigned char ascll);
void lcd1602_init();
void lcd1602_write(bit sign, unsigned char dat) //sign=0 :写入命令 sign=1:写入数据
{
delay_1ms(1);
RS=sign;
RW=0;
EN=0;
DATA=dat;
EN=1;
delay_1ms(1);
EN=1;
RS=0;
}
void lcd1602_init()
{
delay_1ms(10);
lcd1602_write(0,0x38);
lcd1602_write(0,0x38);
lcd1602_write(0,0x38);
lcd1602_write(0,0x0c);
lcd1602_write(0,0x01);
}
void lcd1602_display_str(unsigned char x,bit y,unsigned char dat[])
{
unsigned char point=0x80+x;
unsigned char len=16;
unsigned char j=0;
if(y)
{point+=0x40;}
lcd1602_write(0,point);
len=strlen(dat);
for(j=0;j<len;j++)
{
lcd1602_write(1,dat[j]);
}
}
void lcd1602_display_byte(unsigned char x,bit y,unsigned char ascll)
{
unsigned char point=0x80+x;
if(y)
{point+=0x40;}
lcd1602_write(0,point);
lcd1602_write(1,ascll);
}
以上是基础程序,也就是LCD1602的工作程序(注意我的延时函数未写出,请根据实际芯片的速度写延时函数)
unsigned char table[]=" Hello,World " ;lcd1602_init() ;
lcd1602_display_str(0,1,table);
以上是工作程序(显示字符串),注意的是LCD一行最多16个字符,而且不支持中文,这是在第一列第二行输出的Hello,World,包括空格,一共16个字符。
如果是STC89C52的话,可以使用以下的延时函数
void delay_1ms(unsigned int n){
unsigned int i=0,j=0;
for(i=0;i<n;i++)
for(j=0;j<110;j++);
}
RS BIT P25
RW BIT P26
E BIT P27
WRCMD EQU 30H
TIME EQU 31H
ORG 0000H
AJMP MAIN
ORG 0040H
MAIN: MOV P0,#01H ;清除屏幕
CALL ENABLE ;写到指定寄存器
MOV P0,#38H ;功能设定(8位,2行,57点阵式)
CALL ENABLE ;写到指定寄存器
MOV P0,#0CH ;显示器ON,光标OFF,闪烁OFF
CALL ENABLE ;写到指定寄存器
MOV P0,#80H ;第一行起始地址
CALL ENABLE ;写到指定寄存器
MOV DPTR,#TABLE1
CALL WRITE1 ;到TABLE1取码并写到数据寄存器
CALL DISPLAY
AJMP $
DISPLAY: MOV P0,#0C0H
CALL ENABLE
MOV DPTR,#TABLE2
CALL WRITE3
RET
ENABLE: CLR RS ;RS=0,写到旨令寄存器
CLR RW ;R/W=0
CLR E ;E=1--0使能
CALL DELAY ;调用延时子程序
SETB E ;E=1禁止
RET
WRITE1: MOV R1,#00H ;取码指针
A1: MOV A,R1 ;到TABLE取码
MOVC A,@A+DPTR
CALL WRITE2 ;调用写入到数据寄存器子程序
INC R1 ;取码指针加1
CJNE A,#00H,A1 ;是否取到结束码00H
RET
WRITE3:
MOV R1,#0 ;从左至右显示
A2: MOV A,R1
MOVC A,@A+DPTR
CALL WRITE2
INC R1
CJNE A,#00H,A2
RET
WRITE2: MOV P0,A ;将数据码写入数据寄存器
SETB RS ;RS=1
CLR RW ;R/W=0
CLR E ;E=1--0 使能
CALL DELAY
SETB E ;E=1 禁止
RET
DELAY: MOV R4,#05 ;延时子程序
D1: MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,D1
RET
TABLE1: DB 'Temperature is :',00H
TABLE2: DB '3~9',00H
END
51单片机对lcd1602一些基础程序
#include <intrinsh>
#define dataport P1
sbit RS=P2^ 6;
sbit RW=P2^5;
sbit EN=P2^4;
//========================
//=========================
void waitfor() //检测忙信号函数
{
dataport=0xff;
RS=0;RW=1;_nop_(); //选择指令寄存器 读 *** 作
EN=1;_nop_(); //使能 *** 作
while(dataport&0x80); //如果最高位是1 表示1602正忙 原地踏步 忙完后芯片会将高位拉低
EN=0;
}
//======================
void writedata(unsigned char dataw) //写数据到lcm
{
waitfor(); //测忙
RS=1;RW=0;_nop_(); //选择数据寄存器 写 *** 作
dataport=dataw;_nop_(); //将数据送到数据口
EN=1;_nop_();_nop_();EN=0; //使能
}
//==========================
void writecmd(unsigned char cmd) //写命令到lcm
{
waitfor();
RS=0;RW=0;_nop_();
dataport=cmd;_nop_();
EN=1;_nop_();_nop_();EN=0;
}
//===========================
void init(void) // 初始化函数
{
writecmd(0x38); //功能设定 8位数据传输 双行显示
writecmd(0x0c);//显示器开关
writecmd(0x01);//清屏
writecmd(0x06);//字符进入模式 每进入一个字符光标向右移动一格 原有字符不动
//我在刚开始学的时候不知道下一个字符显示在哪 是和AC值有关还是和光标位置有关
//最后摸索出来是只和光标定位有关 现在还是不知道Ac值有什么用
}
//=========================
void location(unsigned char x,unsigned char y) //确实坐标函数
{
unsigned char temp;
temp=x&0x0f; //只要x数据的后四位
if(y){temp=temp|0x40;} //第一行为0 第二行为1 如果y=1则地址加0x40
temp|=0x80; //DDRAM地址的命令DB7为一
writecmd(temp);
}
//==============================
void displyonechar(unsigned char x,unsigned char y,unsigned char dataw) //显示一个字符函数
{
location(x,y);
writedata(dataw);
}
//=======================================
void displylistchar(unsigned char x,unsigned char y,unsigned char p) //显示字符串
{
while(p) //当一个字符型数组读完时P指的为零
{
displyonechar(x,y,(p++));
x++;
}
}
//=====================================================
void writecgram(unsigned char address,unsigned char p) //写CGRAM的数据
{
unsigned char i=8;
writecmd(address); //CGRAM里的地址 初始值0x40 每次加0x80
while(i--)
{
writedata(p);
p++;
}
}
//=====================================================
void displyonecharacter(unsigned char x,unsigned char y,unsigned char address,unsigned char p) //显示一个自定义字符
{
unsigned char i=8;
writecmd(address); //CGRAM里的地址 初始值0x40 每次加0x08
while(i--)
{
writedata(p);
p++;
}
//============================================================
location(x,y); //设定要显示的位置
writedata((address&=0x3f)/0x08); //要从CGRAM中读出数据在1602上显示 搞了半天发现CGRAM里的地址
} //和DDRAM里的地址有上面的转换关系
//========================================================
void displynumber(unsigned char x,unsigned char y,unsigned long num) //显示一个整数
{
unsigned int number[8];
int k,gh;
for(k=0;;k++)
{
(number+k)=(unsigned int)(num%10);//强制类型转换
num=num/10;
if(num==0)break;
}
for(gh=k;gh>=0;gh--)
{
displyonechar(x,y,((number+gh)+48));
x++;
}
}
//字型码
uchar code nin[]={0x08,0x0f,0x12,0x0f,0,0x1f,0x02,0x02};// "年"
uchar code yue[]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11};// "月"
uchar code ri[]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x11,0x1f};// "日"
显示汉字
displyonecharacter(0,0,0x40,nin);
displyonecharacter(1,0,0x80,yue);
displyonecharacter(1,0,0xc0,ri);
所有人回答的都不对,其实是忘了将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;
}
以上就是关于(求汇编orC程序)将51单片机TO计数器的值传输到1602LCD显示,程序怎么编写全部的内容,包括:(求汇编orC程序)将51单片机TO计数器的值传输到1602LCD显示,程序怎么编写、求助51单片机 显示器1602的输出代码、51单片机驱动1602初始化问题(汇编)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)