📄 hd.c
字号:
#include <c8051f410.H>
#define uchar unsigned char
#define uint unsigned int
#define ulon unsigned long
#define LCD_DATA_PORT P1 // 液晶BD0~BD7与P0口相连
sbit LCD_RS =P0^7; // 液晶 RS 引脚与P2.0相接
sbit LCD_RW =P0^6; // 液晶 R/W 引脚与P2.1相接
sbit LCD_E =P0^5; // 液晶 E 引脚与P2.2相接
sbit LCD_BF =P1^7; // 液晶 DB7 引脚与P0.7相接 Busy Flag
sbit pul =P2^3;
sbit clr =P2^4;
ulon cont,cont1;
// 本地函数
void lcd_delay_us(unsigned char us) // 延时微秒@12M,ms最大值255
{
while(--us)
{
;
}
}
void lcd_delay_ms(unsigned char ms) // 延时毫秒@12M,ms最大值255
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 124; i++)
{
;
}
}
}
// 产生一个使能脉冲
void lcd_e_toggle(void)
{
LCD_E = 1;
lcd_delay_us(3);
LCD_E = 0;
}
// 循环检测LCD忙标志(BF),直到其值为0,方可执行下一指令
void lcd_wait_until_finish(void)
{
LCD_RW = 1; // RW置1,状态为读
LCD_RS = 0; // RS置0,读状态时RS需置低电平
LCD_E = 1; // E 置1,读取信息
lcd_delay_us(100);
while(LCD_BF) // 循环直至BF=0
{
;
}
LCD_E = 0; // E重置为0
}
// 公共函数
// 向LCD写命令字
void lcd_command(unsigned char cmd)
{ while(LCD_BF);
LCD_RW = 0; // RW置0,状态为写
LCD_RS = 0; // RS置0,写入命令字
LCD_E = 0;
LCD_DATA_PORT = cmd; // 将命令字cmd送入LCD的数据端口
lcd_e_toggle(); // 产生使能脉冲,在下降沿开始执行,将命令字读入
lcd_wait_until_finish(); // 等待执行完毕
}
// 设置显示位置(即写入显示地址),x,y均从0开始
void lcd_goto_xy(unsigned char x, unsigned char y)
{
unsigned char p; // p为字符显示位置,即DDRAM中的地址
if (y==0)
{
p = 0x00 + x; // (0,0)显示位置为0x00
}
else
{
p = 0x40 + x; // (0,1)显示位置为0x40
}
lcd_command(p + 0x80); // 写入显示地址时DB7须为高电平,加0x80
}
// 写字符(传入的参数实际为所需显示字符的地址,即液晶字符产生器中字符的地址)
void lcd_putc(unsigned char c)
{
LCD_RW = 0; // RW置0,状态为写
LCD_RS = 1; // RS置1,写入数据
LCD_E = 0;
LCD_DATA_PORT = c; // 将字符c(实际上是字符的地址)送入LCD数据端口
lcd_e_toggle(); // 使能脉冲
lcd_wait_until_finish(); // 等待完成
}
// 指定位置写字符
void lcd_xy_putc(unsigned char x, unsigned char y, unsigned char c)
{
lcd_goto_xy(x,y);
lcd_putc(c);
}
// 写字符串
void lcd_puts(unsigned char *s)
{
while(*s)
{
lcd_putc(*s);
s++;
}
}
// 指定位置写字符串
void lcd_xy_puts(unsigned char x, unsigned char y, unsigned char *s)
{
lcd_goto_xy(x, y);
lcd_puts(s);
}
// LCD初始化
void lcd_init(void)
{
lcd_delay_ms(12); // 上电后适当延时
lcd_command(0x38); // 设为8位接口模式,显示2行字符
lcd_delay_ms(12); // 上电后适当延时
lcd_command(0x38); // 设为8位接口模式,显示2行字符
lcd_delay_ms(12); // 上电后适当延时
lcd_command(0x38); // 设为8位接口模式,显示2行字符
lcd_delay_ms(12); // 上电后适当延时
lcd_command(0x38); // 设为8位接口模式,显示2行字符
lcd_command(0x06); // 写入新数据后光标右移
lcd_command(0x0c); // 显示功能开,不显示光标
lcd_command(0x01); // 清屏
}
swi(uchar swd)
{switch(swd)
{
case 0: lcd_puts("0"); break;
case 1: lcd_puts("1");break;
case 2: lcd_puts("2");break;
case 3: lcd_puts("3");break;
case 4: lcd_puts("4");break;
case 5: lcd_puts("5");break;
case 6: lcd_puts("6");break;
case 7: lcd_puts("7");break;
case 8: lcd_puts("8");break;
case 9: lcd_puts("9");break;
case 10: lcd_puts("10");break;
case 11: lcd_puts(".");break;
}
}
display()
{uchar buf;
lcd_goto_xy(0,1); // 字符位置:(0,1)
buf=cont1/100000;
swi(buf);
buf=(cont1%100000)/10000;
swi(buf);
swi(0x0b);
buf=((cont1%100000)%10000)/1000;
swi(buf);
buf=(((cont1%100000)%10000)%1000)/100;
swi(buf);
buf=((((cont1%100000)%10000)%1000)%100)/10;
swi(buf);
buf=((((cont1%100000)%10000)%1000)%100)%10;
swi(buf);
}
void main(void)
{
XBR1=0X40;
PCA0MD=0X00;
OSCICN|=0x03;
lcd_delay_ms(10);
P0=0;P1=0;P2=0;
lcd_init(); // 初始化LCD
lcd_goto_xy(0,0); // 字符位置:(0,0)
lcd_puts("87694112");
display();
while(1)
{
if(pul==0){cont++;cont1=(cont*25)/8;while(pul==0){ display();}}
if(clr==0){cont=0;cont1=0; display();}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -