⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avr spi.c

📁 一个12896液晶的例子 采用的驱动芯片是S6B0741 是采用SPI方式与单片机通信 源程序为AVR的MEGA16和51的例子 按照程序说明连接
💻 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 + -