#include<reg51h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
uchar code smg_data[]="0123456789ABCDEF";
void delay(uint z);
void write_command(uchar command);
void write_data(uchar dat);
void init();
void scanf();
void main()
{
RW=0;
E=0;
init();
write_command(0x80); //写显示位置
while(1)
{
scanf();
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_command(uchar command)
{
RS=0;
P0=command;
E=1;
delay(5);
E=0;
}
void write_data(uchar dat)
{
RS=1;
P0=dat;
E=1;
delay(5);
E=0;
}
void init()
{
write_command(0x38);
write_command(0x0c);
write_command(0x06);
write_command(0x01);
}
void scanf()
{
uchar key,key_h,key_l;
P1=0x0f;
key_l=P1&0x0f;
if(key_l!=0x0f)
{
delay(10);
key_l=P1&0x0f;
if(key_l!=0x0f)
{
P1=0xf0;
key_h=P1&0xf0;
key=key_l+key_h;
while(key_l!=0x0f)//检测按键放开
{
P1=0x0f;
key_l=P1&0x0f;
}
switch(key)
{
case 0x77:write_command(0x80);write_data(smg_data[0]);break;
case 0x7b:write_command(0x80);write_data(smg_data[1]);break;
case 0x7d:write_command(0x80);write_data(smg_data[2]);break;
case 0x7e:write_command(0x80);write_data(smg_data[3]);break;
case 0xb7:write_command(0x80);write_data(smg_data[4]);break;
case 0xbb:write_command(0x80);write_data(smg_data[5]);break;
case 0xbd:write_command(0x80);write_data(smg_data[6]);break;
case 0xbe:write_command(0x80);write_data(smg_data[7]);break;
case 0xd7:write_command(0x80);write_data(smg_data[8]);break;
case 0xdb:write_command(0x80);write_data(smg_data[9]);break;
case 0xdd:write_command(0x80);write_data(smg_data[10]);break;
case 0xde:write_command(0x80);write_data(smg_data[11]);break;
case 0xe7:write_command(0x80);write_data(smg_data[12]);break;
case 0xeb:write_command(0x80);write_data(smg_data[13]);break;
case 0xed:write_command(0x80);write_data(smg_data[14]);break;
case 0xee:write_command(0x80);write_data(smg_data[15]);break;
default:;break;
}
}
}
}
#include "Regx52h"
#include "intrinsh"
#define uchar unsigned char //宏定义替换
#define uint unsigned int //宏定义替换
#define ulong unsigned long //宏定义替换
你的DelayMS没有定义
有可能是你函数大小写错了,还有可能是你的delayms,h文件中没有这个函数
以单行显示为例,假设每一行20个字符空间,新建字符缓冲区char buffer[21] = "welcome ",定时器设置1s右移一次(可自定义),定时到达后,将buffer内的内容右移一个字节,然后显示,定时再到达后再显示
用定时器1产生脉冲给步进电机驱动器驱动步进电机转用,然后用滴嗒定时器中断,过100MS或若干MS更新LCD显示数值。篇幅有限,只粘贴部份代码,芯片是stm32 F103ZEt6
int main(void)
{
/ 复位所有外设,初始化Flash接口和系统滴答定时器 /
HAL_Init();
/ 配置系统时钟 /
SystemClock_Config();
BSP_LCD_Init();
KEY_GPIO_Init();
STEPMOTOR_TIMx_Init();
LCD_Clear(0,0,LCD_DEFAULT_WIDTH,LCD_DEFAULT_HEIGTH,BLACK);
/ 开背光 /
LCD_BK_ON();
/ 无限循环 /
while (1)
{
if(KEY1_StateRead()==KEY_DOWN)
STEPMOTOR_AxisMoveRel(6400-5, 500 , 500 , 4000);
if(KEY2_StateRead()==KEY_DOWN)
STEPMOTOR_AxisMoveRel(64005, 500 , 500 , 4000);
}
}
void HAL_SYSTICK_Callback(void)
{
time_count++; // 每1ms自动增一
if(time_count==100) // 05s
{
uint8_t str[50];
sprintf((char )str,"%d",srdstep_delay);//显示定时器计数值
LCD_Clear(120,300,200,24,BLACK);
LCD_DispString_EN(120,300,(char )str,BLACK,RED,USE_FONT_24);
sprintf((char )str,"%d",step_position/6400); //显示总共多少圈
LCD_Clear(120,400,200,24,BLACK);
LCD_DispString_EN(120,400,(char )str,BLACK,RED,USE_FONT_24);
time_count=0;
if(MotionStatus==STOP)
{
LCD_Clear(120,430,200,24,BLACK);
LCD_DispString_EN(120,430,"motro is stop",BLACK,RED,USE_FONT_24);
sprintf((char )str,"%d",srddecel_val/6400); //显示减速有多少圈
LCD_Clear(120,430+24,200,24,BLACK);
LCD_DispString_EN(120,430+24,(char )str,BLACK,RED,USE_FONT_24);
}
else
{
LCD_Clear(120,430,200,24,BLACK);
LCD_DispString_EN(120,430,"motro is running",BLACK,RED,USE_FONT_24);
sprintf((char )str,"%d",0);
LCD_Clear(120,430+24,200,24,BLACK);
LCD_DispString_EN(120,430+24,(char )str,BLACK,RED,USE_FONT_24);
}
}
}
移动的话其实和显示停止的原理应该是一样,要移动就是每次显示不同的“图形”,比如当前点在“5,3”,下一步就让它出现在“7,3”,当然要人眼观察效果好的话这个还需要自己研究下,或者找下是否有第三方的工具软件
你这个液晶屏不是一般开发板能带有的。大致读了一下:
#include <avr/ioh> #include "boardh" #include "manageh"//调用头文件 #include "scanh" #include "timerh" #include "lcdh"
void sys_init(void);
void bus_reset(void);
int main(void) //主程序
{ uint8_t i = 0; //这里定义了一个计数器,用于指示灯闪烁计时用
sys_init(); //系统初始化,具体程序在下面
int_init(); //又初始化了一个什么东西,先不管
// timer0_init(); //没有用到time0
timer1_init(); //time1初始化,但是就现有程序而言还无法知道计时周期
// timer2_init();
// adc_init();
wdt_disable(); //先禁用看门狗
wdt_enable(WDTO_250MS); //设置看门狗250ms为一周期
wdt_reset(); //复位看门狗
sei(); //禁用中断
// 初始化LCD
lcd_init(); //调用液晶屏初始化程序
while(1) //主程序循环
{ manage(); //应该是处理液晶显示内容用的子程序
if (i & 0x10)
LED_ON(); //0x10个周期后LED闪烁
else
LED_OFF();
i++;
delay_ms(10);
wdt_reset(); //复位看门狗
}
}
// 系统初始化
void sys_init(void) //系统初始化子程序的详细内容(看来只定义了IO口还真不知道这个系统内单片机的定时器如何初始化的)
{
PORTA = 0xf2; //定义IO口
DDRA = 0; // PA7~PA4 键盘输入,PA3: LCD_A0复用电池测量时,输出1
// PA2: 输入,测电池电压, PA1:LCD_CS, PA0:输入,测总线电压?
PORTB = 0xff;
DDRB = 0x00; // PB输出,LCD_DB,PB0~PB4 KEY SCAN
PORTC = 0x80;
DDRC = 0xc0; // PC输出,PC7:LCD_RST,PC6:LCD_LED+,
PORTD = 0x03;
DDRD = 0xf3; // PD7:PWM,PD6:ZL,PD5:ZH,PD4:LED
// PD3返回,PD2开关, PD1:LCD_RD, PD0:LCD_WR
}
void lcd_init(void) //LCD的初始化
{
uint8_t i;
LCD_RST_L(); //应该是复位LCD
delay_ms(2); //延时
LCD_RST_H(); //复位完毕,该复位引脚拉高
for (i=0; i<8; i++) //复位8次看门狗?
{
delay_ms(20);
wdt_reset();
}
write_cmd(0xe2);//system reset 24 //写一个复位命令?
delay_ms(10);
write_cmd(0xeb);//set bias RATIO=1/12 27 =E8 FOR LOW POWER //设置液晶屏偏压
write_cmd(0x81);//set refence voltage ;pm 11 DOUBLE command //设置参考电压
write_cmd(0x83);//set RGB D1 21 //设置RGB方式?
write_cmd(0x2f);//set color mode,65K 22 D4 FOR 256 COLOR 3r-3g-2b//设置彩色显示深度
write_cmd(0x2b);//set line rate,358kps 15 A3//设置啥?不是很明白
write_cmd(0x24);//set n-line 5,TempCompensation 00//设置某种补偿?
write_cmd(0xa2); // 15 set line rate 296k
write_cmd(0xd0);//set partial display 21 D0 BGR//设置一个副屏幕?或许这个彩屏还附带一个小屏幕?
write_cmd(0xd6);//set cen 22 d6 64k color 5-6-5//不明白
write_cmd(0xc0); // 19 LC[2:0]
write_cmd(0xaf); //set display on 18, DC[4:2]=111//仍然不明白
delay_ms(10);
wdt_reset();//重启看门狗
}
void write_cmd(uint8_t cmd)//“写命令”子程序
{
LCD_A0_L();//应该是拉低“命令\数据”引脚的电平
LCD_CS_L(); //片选引脚
PORTB = cmd; //PORTB的8个引脚作为并行口向液晶屏输出数据
DDRB = 0xff; //PORTB的方向定义为输出
LCD_WR_L(); //写LCD引脚电平拉低,看来这程序可能是为了防止被中断或者别的情况打乱,特地发送了两遍
LCD_WR_L();
LCD_WR_H();
LCD_CS_H();
DDRB = 0; //改PORTB为高阻态
//个人觉得后面应该还需要两个语句:LCD_CS_H();和LCD_A0_H();已完成一个“写命令”周期
}
总之,你这块液晶屏应该在市场上不常见。要用这个玩意,你必须有对应这块液晶屏的详细文档、数据手册,否则光这么一个程序很难把这个液晶屏玩转了。
1、首先我们打开Keil μVision编译器,新建一个工程,然后保存在硬盘上的位置,然后选择Atmel-AT89C51单片机为模型,并启动器添加STARTUPA51文件,然后在当前目录下新建一个C文件,并将其添加入工作路径。
2、导入51单片机的头文件以及LCD1602的头文件。
3、创建一个延时函数,可以传入想要具体延时的时长,其内部实现是由一个二重循环,两个循环的次数相乘积。
4、然后创建写命令的函数,指定RS和E同时为0时,才可以写入命令,设定完成后,将com写入输出端口,规定写命令时,E为正脉冲,然后空 *** 作一个机器周期等待机器反应。
5、然后创建写数据的函数,规定写数据时,E为正脉冲,规定当RS=1和RW=0时才可以写入数据,然后将数据从输出端口输出,最后让E产生正跳变。
6、然后创建初始化LCD1602的函数,指定显示模式位两行显示,57,8位数据、整体显示,无光标,无闪烁、写入一个字符后地址指针加1,最后进行清屏 *** 作。
7、最后在主函数中首先执行LCD1602的初始化函数,首先创建一个无限循环,然后添加两个字符串,这里以两行显示百度经验的网址为例,再进行延时以及使用清屏函数进行刷新。
以上就是关于单片机LCD程序求救在线等 定有重赏!!!!!!!!!!全部的内容,包括:单片机LCD程序求救在线等 定有重赏!!!!!!!!!!、关于一段LCD显示程序的调试问题,用keil uvision4编译的,错误代码是c267,该怎么解决、用单片机控制字符型LCD循环右移显示welcome等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)