单片机LCD程序求救在线等 定有重赏!!!!!!!!!!

单片机LCD程序求救在线等 定有重赏!!!!!!!!!!,第1张

#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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9825742.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存