4
5
32
新手上路
使用道具 举报 送花
842
1万
2万
管理员
10
195
1143
金牌会员
DIY玩家
97
7247
超级版主
#include <STC8G.H> #include "define.h" #include <intrins.h> #define RXD P30 #define TXD P31 #define SCL P32 #define SDA P33 bit I2C_Busy; unsigned char code BMP[]= { #include <0.h> }; void Delay_10ms(void) { unsigned char i,j; _nop_(); _nop_(); i=144; j=157; do { while(--j); } while(--i); WDT_CONTR=CLR_WDT; } void Delay_x10ms(unsigned char x) { while(--x) Delay_10ms(); } void I2C_Start(void) { I2C_Busy=1; I2CMSCR=0x81; while(I2C_Busy); } void I2C_SendData(unsigned char dat) { I2CTXD=dat; I2C_Busy=1; I2CMSCR=0x82; while(I2C_Busy); } void I2C_RecvACK(void) { I2C_Busy=1; I2CMSCR=0x83; while(I2C_Busy); } //unsigned char I2C_RecvData(void) //{ // I2C_Busy=1; // I2CMSCR=0x84; // while(I2C_Busy); // return I2CRXD; //} //void I2C_SendACK(void) //{ // I2CMSST=0x00; // I2C_Busy=1; // I2CMSCR=0x85; // while(I2C_Busy); //} //void I2C_SendNAK(void) //{ // I2CMSST=0x01; // I2C_Busy=1; // I2CMSCR=0x85; // while(I2C_Busy); //} void I2C_Stop(void) { I2C_Busy=1; I2CMSCR=0x86; while(I2C_Busy); } void SSD1316_Write_CMD(unsigned char cmd) { I2C_Start(); I2C_SendData(0x78); I2C_RecvACK(); I2C_SendData(0x00); I2C_RecvACK(); I2C_SendData(cmd); I2C_RecvACK(); I2C_Stop(); } void SSD1316_Write_DATA_A(void) { I2C_Start(); I2C_SendData(0x78); I2C_RecvACK(); I2C_SendData(0x40); I2C_RecvACK(); } void SSD1316_Write_DATA_B(unsigned char dat) { I2C_SendData(dat); I2C_RecvACK(); } void SSD1316_Write_DATA_C(void) { I2C_Stop(); } void SSD1316_Clear(void) { unsigned char i,n; for(i=0;i<4;i++) { SSD1316_Write_CMD(0xb0+i); //设置页地址(0~3) SSD1316_Write_CMD(0x00); //设置显示位置—列低地址 SSD1316_Write_CMD(0x10); //设置显示位置—列高地址 SSD1316_Write_DATA_A(); for(n=0;n<128;n++) { SSD1316_Write_DATA_B(0x00); } SSD1316_Write_DATA_C(); } } void SSD1316_Display_128x32(void) { unsigned int i; SSD1316_Write_CMD(0x20); //Set Memory Addressing Mode(设置内存寻址模式) SSD1316_Write_CMD(0x01); //0x01(垂直寻址模式) SSD1316_Write_CMD(0x21); //Set Column Address(设置列地址) SSD1316_Write_CMD(0); //(列开始地址) SSD1316_Write_CMD(127); //(列结束地址) SSD1316_Write_CMD(0x22); //Set Page Address(设置页地址) SSD1316_Write_CMD(0x00); //0 SSD1316_Write_CMD(0x03); //3 SSD1316_Write_DATA_A(); for(i=0;i<512;i++) { SSD1316_Write_DATA_B(BMP[i]); } SSD1316_Write_DATA_C(); SSD1316_Write_CMD(0x20); //Set Memory Addressing Mode(设置内存寻址模式) SSD1316_Write_CMD(0x02); //0x02(页寻址模式) } void SSD1316_Init(void) { SSD1316_Write_CMD(0xAE); //Set Display OFF(设置显示关) SSD1316_Write_CMD(0xA1); //Set Segment Remap(设置列重映射) SSD1316_Write_CMD(0xA8); //Set Multiplex Ratio(设置行通道数) SSD1316_Write_CMD(0x1F); //31 // SSD1316_Write_CMD(0xC8); //Set COM Output Scan Direction(设置行重映射) SSD1316_Write_CMD(0xD3); //Set Display Offset(设置垂直偏移量) SSD1316_Write_CMD(0x00); //0 SSD1316_Write_CMD(0xD5); //Set Display Clock Divide Ratio/Oscillator Frequency(设置显示时钟分频器、振荡器频率) SSD1316_Write_CMD(0xF0); //0xF0 SSD1316_Write_CMD(0x8D); //Charge Pump Setting(设置电荷泵) SSD1316_Write_CMD(0x14); //0x14 SSD1316_Write_CMD(0xAF); //Set Display ON(设置显示开) SSD1316_Clear(); // SSD1316_Write_CMD(0x81); //Set Contrast Control(设置对比度) // SSD1316_Write_CMD(0x7F); //127 // SSD1316_Write_CMD(0xA7); //Set Normal/Inverse Display(设置反相显示) } void Init(void) { P_SW2|=EAXFR; P3M0=0x00; P3M1=0x00; P5M0=0x00; P5M1=0x00; P3PU=0x0c; I2CCFG=0xC1; //921.6K@11.0592M I2CMSCR=EMSI; I2CMSST=0x00; EA=1; Delay_x10ms(10); SSD1316_Init(); } void main(void) { Init(); SSD1316_Display_128x32(); while(1) { SSD1316_Write_CMD(0xA6); Delay_x10ms(50); SSD1316_Write_CMD(0xA7); Delay_x10ms(50); } } void I2C_Isr(void) interrupt 24 { _push_(P_SW2); P_SW2|=EAXFR; if(I2CMSST&MSIF) { I2CMSST&=~MSIF; I2C_Busy=0; } _pop_(P_SW2); }复制代码
Debu*** 发表于 2026-3-6 13:51 SSD1316
神*** 发表于 2026-3-6 10:43 https://www.stcaimcu.com/thread-18574-1-1.html
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2026-3-7 11:12 , Processed in 0.116203 second(s), 68 queries .
Powered by Discuz! X3.5
© 2001-2026 Discuz! Team.