利用AT89C51单片机让12864显示数字,并且可以修改所显示的数字,请给出C语言代码
时间: 2024-04-29 12:21:33 浏览: 107
给予89c51和12864LCD的函数曲线画法的c51代码
下面是一个简单的C语言代码示例,用于控制AT89C51单片机与12864液晶屏之间的通信,以显示数字并允许修改。
```c
#include <reg51.h>
#include <intrins.h>
#define LCD_DATA P0 // 12864液晶屏数据线接P0口
sbit LCD_RS = P2^6; // 12864液晶屏RS端口
sbit LCD_RW = P2^5; // 12864液晶屏RW端口
sbit LCD_EN = P2^7; // 12864液晶屏EN端口
void delay(unsigned int t) // 延时函数
{
while(t--);
}
void write_cmd(unsigned char cmd) // 写命令函数
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATA = cmd;
_nop_();
_nop_();
LCD_EN = 0;
}
void write_data(unsigned char dat) // 写数据函数
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATA = dat;
_nop_();
_nop_();
LCD_EN = 0;
}
void init_lcd() // 初始化函数
{
write_cmd(0x30); // 基本指令集
delay(500);
write_cmd(0x01); // 清屏指令
delay(500);
write_cmd(0x0c); // 关闭光标
delay(500);
write_cmd(0x06); // 光标右移
delay(500);
}
void display_num(unsigned char x, unsigned char y, unsigned int num) // 显示数字函数
{
unsigned char i;
unsigned char num_str[6] = {0}; // 存储数字的字符数组
sprintf(num_str, "%d", num); // 将数字转化为字符数组
write_cmd(0x34); // 扩展指令集,开启图形显示模式
for(i = 0; i < 5; i++)
{
write_cmd(0x36); // 设置显示地址
write_cmd(0x30 + y * 8 + i); // 行地址
write_cmd(0x80 + x * 6); // 列地址
write_cmd(num_str[i]); // 写入数字
}
write_cmd(0x35); // 关闭图形显示模式
}
void main()
{
unsigned int num = 12345;
unsigned char x = 1, y = 2; // 数字显示的位置
init_lcd(); // 初始化12864液晶屏
while(1)
{
display_num(x, y, num); // 显示数字
delay(5000); // 稍作延时
num++; // 数字加1
if(num > 99999) // 如果数字超出范围,则重新从0开始
{
num = 0;
}
if(P3 & 0x01) // 如果P3.0口接了按钮,则可以通过按钮修改数字显示的位置
{
x++;
if(x > 20)
{
x = 0;
}
}
if(P3 & 0x02) // 如果P3.1口接了按钮,则可以通过按钮修改数字显示的位置
{
y++;
if(y > 3)
{
y = 0;
}
}
}
}
```
在这个示例中,我们使用sprintf函数将数字转换为字符数组,然后将字符数组写入12864液晶屏中。我们还可以通过P3口上的按钮来修改数字显示的位置。
阅读全文