10
1159
5121
论坛元老
/* Main.c file generated by New Project wizard * * Created: 周四 2月 9 2023 * Processor: STC15W4K32S4 * Compiler: Keil for 8051 I/O口 不够,咋办 使用2位数据线做控制 LCD1602 用 HC164 的串行输入控制 扩展输出 8位 */ #include <reg51.h> #include <stdio.h> #include <intrins.h > //头文件的包含 _nop_() //#define MAIN_Fosc 11059200UL //定义主时钟 #define MAIN_Fosc 12000000UL //定义主时钟 sfr P0M1 = 0x93; sfr P0M0 = 0x94; sfr P1M1 = 0x91; sfr P1M0 = 0x92; sfr P2M1 = 0x95; sfr P2M0 = 0x96; sfr P3M1 = 0xb1; sfr P3M0 = 0xb2; sfr P4M1 = 0xb3; sfr P4M0 = 0xb4; sfr P5M1 = 0xC9; sfr P5M0 = 0xCA; sfr P6M1 = 0xCB; sfr P6M0 = 0xCC; sfr P7M1 = 0xE1; sfr P7M0 = 0xE2; typedef unsigned char uint8; // 无符号8位整型变量 // typedef unsigned int uint16; // 无符号16位整型变量 // /******************************************************************************************** // 指令集 //将所有可能用到的指令先预定义一下,方面以后的使用 /********************************************************************************************/ #define CMD_clear 0x01 // 清除屏幕 #define CMD_back 0x02 // DDRAM回零位 #define CMD_dec1 0x04 // 读入后AC(指针)减1,向左写 #define CMD_add1 0x06 // 读入后AC(指针)加1,向右写 #define CMD_dis_gb1 0x0f // 开显示_开光标_开光标闪烁 #define CMD_dis_gb2 0x0e // 开显示_开光标_关光标闪烁 #define CMD_dis_gb3 0x0c // 开显示_关光标_关光标闪烁 #define CMD_OFF_dis 0x08 // 关显示_关光标_关光标闪烁 #define CMD_set82 0x38 // 8位总线_2行显示 #define CMD_set81 0x30 // 8位总线_1行显示(上边行) #define CMD_set42 0x28 // 4位总线_2行显示 #define CMD_set41 0x20 // 4位总线_1行显示(上边行) #define lin_1 0x80 // 4位总线_1行显示(上边行) #define lin_2 0xc0 // 4位总线_1行显示(上边行) sbit LCD1602_RS=P2^1; /* Data Command Pin 1 data 0 command pin 4 */ sbit LCD1602_E =P2^0; /* LCD Enable Signal pin 6 */ bit rs = 0; // lcd 'rs' flag void _delay_us(uint16 i) { while(i--) { _nop_(); _nop_(); _nop_(); _nop_(); } } void Delay1ms(unsigned int xms) { uint16 x,y; for(x=xms;x>12;x--) for(y=169;y>0;y--); } /******************************************************************************************** // 写数据程序 // /********************************************************************************************/ void LCD1602_Write(uint8 LCD1602_work) { uint8 bitctr = 8; do // start of bit clock cycle { if(!(LCD1602_work & 128)) // if b7 is a '0' bit LCD1602_RS = 0; // start clock cycle for a '0' _delay_us(55); // charge or drain cap to 3t LCD1602_RS = 0; // start clock cycle for a '1' LCD1602_RS = 1; // clock out the '0' or '1' LCD1602_work <<= 1; // prep for next bit } while(--bitctr); // until all 8 bits clocked out if(!rs) LCD1602_RS = 0; // make clk pin = rs flag LCD1602_E = 1; // latch 595, pulse LCD 'E' pin LCD1602_E = 0; // " LCD1602_RS = 1; // always leave clk pin high } /******************************************************************************************** // 写指令程序 // /********************************************************************************************/ void LCD1602_WriteCMD(uint8 LCD1602_command) { rs = 0; LCD1602_Write(LCD1602_command); rs = 1; } /******************************************************************************************** // 初始化 /********************************************************************************************/ void LCD1602_Init(void){ LCD1602_E = 0; LCD1602_RS = 1; Delay1ms(100); LCD1602_WriteCMD(CMD_set82); //16*2显示,5*7点阵,8位数据 LCD1602_WriteCMD(CMD_set82); LCD1602_WriteCMD(CMD_clear); LCD1602_WriteCMD(CMD_back); LCD1602_WriteCMD(CMD_add1); LCD1602_WriteCMD(CMD_dis_gb3); Delay1ms(2); } /******************************************************************************************** // 打印字符串程序 // (本函数调用指针函数) // 第一行位置 0x00~0x0f 第二行位置 0x40~0x4f /********************************************************************************************/ void print_str(uint8 a, uint8 *str){ LCD1602_WriteCMD(a | 0x80); while(*str != '\0'){ LCD1602_Write(*str++); //_delay_us(2); } *str = 0; } /******************************************************************************************** // 打印单字符程序 // /********************************************************************************************/ /* void print_char(uint8 a,uint8 t){ LCD1602_WriteCMD(a | 0x80); LCD1602_Write(t); }*/ void main(void) { P2M0 = 0x00; P2M1 = 0x00; LCD1602_Init(); print_str(0x80,"Hi stcaimcu.com"); Delay1ms(1); print_str(0xC0,"0123456789ABCDEF"); // Write your code here while (1){ //print_str(0xC0,"0123456789ABCDEF"); } } 复制代码
使用道具 举报 送花
STC8H8K64U转STC89-打狗棒
717
1万
管理员
神*** 发表于 2023-2-11 22:51 I/O 不够,可以 用 开天斧-STC8H8K64U-45MHz-LQFP64转DIP64
73
5882
超级版主
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2025-5-2 06:23 , Processed in 0.124822 second(s), 85 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.