📄 avr spi.c
字号:
#include <inavr.h>
#include <iom16.h>
#include <stdio.h>
/* s6b0741接线方式
连接线图:
-----------------
|M16-----s6b0741|
-----------------
|DB0----- | DB4----- CS|
|DB1----- | DB5----- SID|
|DB2----- RS| DB6----- |
|DB3----- RST| DB7-----SCLK|
------------------------------- */
/* CS1= 0 PORTB=PORTB & 0xEF
CS1= 1 PORTB=PORTB | 0x10
SCLK= 0 PORTB=PORTB & 0x7F
SCLK= 1 PORTB=PORTB | 0x80
RST= 0 PORTB=PORTB & 0xF7
RST= 1 PORTB=PORTB | 0x08
RS= 0 PORTB=PORTB & 0xFB
RS= 1 PORTB=PORTB | 0x04 */
unsigned char p,n,ch,cl; //定义地址为全局变量
unsigned char __flash hzk[][32]= // HanZi11 软件 下半列排 生成
{
{0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0xC2,0x83,0x02,0x00,0x00,
0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x60,0x40,0x00}, /*"正",0*/
{0x00,0xF8,0x08,0x08,0xCC,0x4A,0x49,0x48,0x48,0x48,0xE8,0x48,0x08,0xFC,0x08,0x00,
0x00,0xFF,0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x08,0x1F,0x40,0x80,0x7F,0x00,0x00}, /*"向",1*/
{0x24,0x24,0x24,0xA4,0xFE,0xA3,0x22,0x00,0x24,0x48,0x00,0xFF,0x00,0x80,0x00,0x00,
0x10,0x08,0x06,0x01,0xFF,0x00,0x01,0x02,0x02,0x02,0x02,0xFF,0x01,0x01,0x01,0x00}, /*"科",2*/
{0x10,0x10,0x10,0xFF,0x10,0x10,0x88,0x88,0x88,0xFF,0x88,0x88,0x8C,0x08,0x00,0x00,
0x04,0x44,0x82,0x7F,0x01,0x80,0x81,0x46,0x28,0x10,0x28,0x26,0x41,0xC0,0x40,0x00}, /*"技",3*/
{0x04,0x34,0xC4,0x04,0xC4,0x3C,0x20,0x10,0x0F,0xE8,0x08,0x08,0x28,0x18,0x00,0x00,
0x10,0x08,0x06,0x01,0x82,0x8C,0x40,0x30,0x0C,0x03,0x0C,0x10,0x60,0xC0,0x40,0x00}, /*"欢",4*/
{0x40,0x42,0x44,0xC8,0x00,0xFC,0x04,0x02,0x82,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
0x00,0x40,0x20,0x1F,0x20,0x47,0x42,0x41,0x40,0x7F,0x40,0x42,0x44,0x63,0x20,0x00}, /*"迎",5*/
{0x40,0x20,0x10,0xFC,0x23,0x10,0x8C,0x67,0x04,0xF4,0x04,0x44,0x94,0x8C,0x00,0x00,
0x40,0x30,0x00,0x77,0x80,0x81,0x88,0x92,0xB4,0x83,0x80,0xE0,0x00,0x11,0x60,0x00}, /*"您",6*/
};
unsigned char __flash asczk[][6] =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp
{ 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
{ 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
{ 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #
{ 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $
{ 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // %
{ 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
{ 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
{ 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (
{ 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // )
{ 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
{ 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
{ 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // ,
{ 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // -
{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // .
{ 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
{ 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0
{ 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1
{ 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2
{ 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3
{ 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4
{ 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5
{ 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6
{ 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7
{ 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8
{ 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9
{ 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // :
{ 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ;
{ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
{ 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
{ 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
{ 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
{ 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @
{ 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A
{ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B
{ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C
{ 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D
{ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E
{ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F
{ 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G
{ 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H
{ 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I
{ 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J
{ 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K
{ 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L
{ 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M
{ 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N
{ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O
{ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P
{ 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q
{ 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R
{ 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S
{ 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T
{ 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U
{ 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V
{ 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W
{ 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X
{ 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y
{ 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z
{ 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [
{ 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55
{ 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ]
{ 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
{ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
{ 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // '
{ 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
{ 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b
{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
{ 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d
{ 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
{ 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f
{ 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g
{ 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h
{ 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i
{ 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j
{ 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k
{ 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l
{ 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m
{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n
{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
{ 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p
{ 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q
{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r
{ 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
{ 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t
{ 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u
{ 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v
{ 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w
{ 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
{ 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y
{ 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z
{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines
};
void delayms(unsigned int ms)
{
unsigned int mm,tt;
tt=200*ms;
for(mm=0;mm<tt;mm++)
{ }
}
void delay(unsigned int nnn)
{
unsigned int mmm,pp;
pp=200*nnn;
while(pp-->0)
for(mmm=0;mmm<1000;mmm++)
{ }
}
void wcomd(unsigned char cdat)
{
PORTB=PORTB & 0xEB; /* CS= 0 RS= 0 */
SPDR = cdat;
while(!(SPSR & 0x80)) ;
PORTB=PORTB | 0x14; /* RS= 1 CS= 1 */
SPSR=SPSR & 0x7F;
}
void wdata(unsigned char ddat)
{
PORTB=PORTB & 0xEF; /* CS= 0 */
PORTB=PORTB | 0x04; /* RS= 1 */
SPDR = ddat;
while(!(SPSR & 0x80)) ;
PORTB=PORTB & 0xFB; /* RS= 0 */
PORTB=PORTB | 0x10; /* CS= 1 */
SPSR=SPSR & 0x7F;
}
void LCD_Initial()
{
delayms(10);
wcomd(0xe2); /* software reset */
wcomd(0x48); /* duty 占空比设置*/
wcomd(96); /* duty 一次更新96行 占空比1/96 */
wcomd(0xa1); /* ADC=1: SEG reverse direction SEGMENT方向设置: 7FH 到 00H 为正向 map or Re-map */
wcomd(0xc0); /* SHL=0: COM normal direction COM输出方向设置: COM0 →COM127 为正向*/
wcomd(0x44); /* com0 register 设置COM0显示的起始行*/
wcomd(0x10); /* com0 register PAGE2 为COM0起始显示行*/
wcomd(0xab); /* oscilator start 晶振开始 */
delayms(10);
wcomd(0x67); /* Set 6 dc-dc step-up DC到 DC变换6倍升压 */
wcomd(0x27); /* Internal Regulator Resistor Ratio 内部调压电阻比率*/
wcomd(0x83); /* voltage OTP programming */
wcomd(0x39); /* voltage 无 */
wcomd(0x56); /* Set LCD Bias 设置LCD偏压 1/11 */
wcomd(0x94); /* 3FRC 9PWM */
wcomd(0x88); /* Set white mode and 1st/2nd frame */
wcomd(0x00); /* gray scal register1 */
wcomd(0x00); /* gray scal register2*/
wcomd(0x89); /* Set White Mode, Frame 4th, Frame 3rd */
wcomd(0x00); /* gray scal register1 */
wcomd(0x00); /* gray scal register2*/
wcomd(0x8F); /* Set Dark Mode, Frame 4th & Frame 3rd */
wcomd(0x09); /* gray scal register1 */
wcomd(0x09); /* gray scal register2*/
wcomd(0x2c); /* Set-power VC */
delayms(10);
wcomd(0x2e); /* Set-power VC VR */
delayms(10);
wcomd(0x2f); /* Set-power VC VR VF */
delayms(10);
wcomd(0x4f); /* Set N-line Inversion */
wcomd(32); /* 32行反转显示 减少色度亮度干扰 */
wcomd(0x40); /* set start line 设置显示起始行*/
wcomd(0x00); /* Set start line 00H*/
wcomd(0xaf); /* display on */
}
void hzshift(unsigned char a,unsigned char b) //总的液晶显示面积为6*8(高度*宽度)字节单位
{
p=(a-1); //字节行列坐标转成显示单元的坐标
n=8*(b-1); //n应该为无符号数,防止移位时高位为符号
cl=n;
cl=cl & 0x0F; //列的低4位
ch=(n>>4) | 0x10; //列的高3位
}
void ascshift(unsigned char a,unsigned char b) //总的液晶显示面积为6*8(高度*宽度)字节单位
{
p=(a-1); //字节行列坐标转成显示单元的坐标
n=6*(b-1); //n应该为无符号数,防止移位时高位为符号
cl=n;
cl=cl & 0x0F; //列的低4位
ch=(n>>4) | 0x10; //列的高3位
}
void hz_tran(unsigned char x,unsigned char y,unsigned char __flash *hzk_p)
{
unsigned char i,j;
hzshift(x,y);
for(j=0;j<2;j++)
{
wcomd(p+0xb0); /*Set Page Address*/
wcomd(ch); /*Set Column Address MSI*/
wcomd(cl); /*Set Column Address LSI*/
for(i=0;i<16;i++)
{
wdata(*hzk_p);
wdata(*hzk_p);
hzk_p++;
}
p++;
}
}
void asc_tran(unsigned char x,unsigned char y,unsigned char __flash *asc_p)
{
unsigned char i;
ascshift(x,y);
wcomd(p+0xb0); /*Set Page Address */
wcomd(ch); /*Set Column Address MSI*/
wcomd(cl); /*Set Column Address LSI*/
for(i=0;i<6;i++)
{
wdata(*asc_p);
wdata(*asc_p);
asc_p++;
}
}
void LCD_CLS(void)
{
unsigned int i,j;
for(j=0;j<12;j++)
{
wcomd(j+0xb0); /*Set Page Address*/
wcomd(0x10); /*Set Column Address MSI*/
wcomd(0x00); /*Set Column Address LSI*/
for(i=0;i<128;i++)
{
wdata(0x00);
wdata(0x00);
}
}
}
void setup()
{
DDRB=0;
DDRB = DDRB | 0xFF; /*PORTB 全部设置为输出*/
SPCR = 0x51; /* 使能SPI,高位发送,主机模式,上升沿为起始沿,结束沿为下降沿,起始沿采样,16分频,沿的模式根据屏的手册设置 */
SPSR = SPSR & 0x7E; /* 清SPI 中断标志*/
PORTB = PORTB | 0x10; /* CS=1 */
PORTB = PORTB & 0xF7; /* RST=0 */
}
void main(void)
{
setup();
delay(5);
PORTB=PORTB | 0x08;
LCD_Initial();
wcomd(0x81);
wcomd(0x3A);
LCD_CLS();
for(;;)
{
hz_tran(2,4,hzk[0]);
hz_tran(4,6,hzk[1]);
hz_tran(6,8,hzk[2]);
hz_tran(8,10,hzk[3]);
asc_tran(12,13,asczk[24]);
asc_tran(12,14,asczk[18]);
asc_tran(12,15,asczk[18]);
asc_tran(12,16,asczk[21]);
asc_tran(12,17,asczk[23]);
asc_tran(12,18,asczk[24]);
asc_tran(12,19,asczk[21]);
asc_tran(12,20,asczk[23]);
delay(10);
LCD_CLS();
delay(5);
hz_tran(6,4,hzk[4]);
hz_tran(6,8,hzk[5]);
hz_tran(6,12,hzk[6]);
delay(10);
LCD_CLS();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -