mg12232.c
上传用户:xs588588
上传日期:2021-03-30
资源大小:242k
文件大小:5k
源码类别:

DSP编程

开发平台:

C/C++

  1. #include <msp430x14x.h>
  2. #include "mg12232.h"
  3. char WordTable[] = {
  4.     0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,
  5. 0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00,
  6. 0x00,0x07,0x02,0x02,0x02,0x02,0x3F,0x42,
  7. 0x42,0x42,0x42,0x47,0x40,0x70,0x00,0x00
  8. };
  9. void main(void)
  10. {
  11. // 关闭看门狗
  12. WDTCTL = WDTPW + WDTHOLD;   
  13. // 关闭中断
  14.     _DINT();
  15.     
  16.     // 初始化
  17.     Init_CLK();
  18.     Init_Port();
  19. //初始化MG-12232
  20. LcdDisplayInit(0);
  21. LcdDisplayInit(1);
  22. //显示的起始行为第0行,起始列为第0列,
  23. //起始页为第0页,显示区为E1区,内容为"电"
  24. LcdDisplayWord(0,0xC0,0xB8,0,WordTable);
  25. return;
  26. }
  27. void Init_CLK(void)
  28. {
  29.     unsigned int i;
  30.     BCSCTL1 = 0X00; //将寄存器的内容清零
  31. //XT2震荡器开启
  32. //LFTX1工作在低频模式
  33. //ACLK的分频因子为1
  34.     do 
  35.     {
  36. // 清除OSCFault标志
  37.     IFG1 &= ~OFIFG;    
  38.     for (i = 0x20; i > 0; i--);                
  39.     }
  40.     while ((IFG1 & OFIFG) == OFIFG);// 如果OSCFault =1   
  41. //将寄存器的内容清零
  42.     BCSCTL2 = 0X00;
  43. //MCLK的时钟源为TX2CLK,分频因子为1
  44.     BCSCTL2 += SELM1;
  45. //SMCLK的时钟源为TX2CLK,分频因子为1
  46.     BCSCTL2 += SELS;
  47. return;
  48. }
  49. void Init_Port(void)
  50. {
  51. // P5.0 P5.1 P5.2 P5.3为输出
  52. P5DIR |= BIT0;
  53. P5DIR |= BIT1;
  54. P5DIR |= BIT2;
  55. P5DIR |= BIT3;
  56. return;
  57. }
  58. void E1_High(void)
  59. {
  60. //P5.2管脚输出为高电平
  61. P5OUT |= BIT2;
  62.     _NOP();
  63.     _NOP();
  64.     return;
  65. }
  66. void E1_Low(void)
  67. {
  68. //P5.2管脚输出为低电平
  69. P5OUT &= ~(BIT2);
  70.     _NOP();
  71.     _NOP();
  72.     return;
  73. }
  74. void E2_High(void)
  75. {
  76. //P5.3管脚输出为高电平
  77. P5OUT |= BIT3;
  78.     _NOP();
  79.     _NOP();
  80.     return;
  81. }
  82. void E2_Low(void)
  83. {
  84. //P5.3管脚输出为低电平
  85. P5OUT &= ~(BIT3);
  86.     _NOP();
  87.     _NOP();
  88.     return;
  89. }
  90. void A0_High(void)
  91. {
  92. //P5.0管脚输出为高电平
  93. P5OUT |= BIT0;
  94.     _NOP();
  95.     _NOP();
  96.     return;
  97. }
  98. void A0_Low(void)
  99. {
  100. //P5.0管脚输出为低电平
  101. P5OUT &= ~(BIT0);
  102.     _NOP();
  103.     _NOP();
  104.     return;
  105. }
  106. void R_W_High(void)
  107. {
  108. //P5.1管脚输出为高电平
  109. P5OUT |= BIT1;
  110.     _NOP();
  111.     _NOP();
  112.     return;
  113. }
  114. void R_W_Low(void)
  115. {
  116. //P5.1管脚输出为低电平
  117. P5OUT &= ~(BIT1);
  118.     _NOP();
  119.     _NOP();
  120.     return;
  121. }
  122. //等待空闲状态
  123. void WaitIdle(int nZone)
  124. {
  125. char nTemp;
  126. //设置P4口为输入方向
  127. P4DIR = 0;
  128. for(;;)
  129. {
  130. if(nZone == 0)
  131. {
  132. //E1区
  133.             E1_High();
  134. E2_Low();
  135. }
  136. else
  137. {
  138. //E2区
  139. E2_High();
  140. E1_Low();
  141. }
  142. R_W_High();
  143. A0_Low();
  144. //取出D7
  145. nTemp = (P4IN & BIT7);
  146. nTemp >>= 7;
  147. //空闲就跳出循环
  148. if(nTemp == 0) break;
  149. }
  150. return;
  151. }
  152. void SendCommand(int nZone,char nVal)
  153. {
  154. //等待闲
  155.     WaitIdle(nZone);
  156. //设置P4口为输出方向
  157. P4DIR = 0xff;
  158. if(nZone == 0)
  159. {
  160. //E1区
  161.         E1_High();
  162. E2_Low();
  163. }
  164. else
  165. {
  166. //E2区
  167. E2_High();
  168. E1_Low();
  169. }
  170. R_W_Low();
  171. A0_Low();
  172. P4OUT = nVal;
  173. //写入指令
  174.     if(nZone == 0)
  175. {
  176. //E1区
  177. E1_Low();
  178. }
  179. else
  180. {
  181. //E2区
  182. E2_Low();
  183. }
  184. R_W_High();
  185. return;
  186. }
  187. void WriteData(int nZone,char nVal, char nAddr)
  188. {
  189. //设置列地址
  190. SendCommand(nZone,nAddr);
  191. //等待空闲
  192.     WaitIdle(nZone);
  193. //设置P4口为输出方向
  194. P4DIR = 0xff;
  195. if(nZone == 0)
  196. {
  197. //E1区
  198.         E1_High();
  199. E2_Low();
  200. }
  201. else
  202. {
  203. //E2区
  204. E2_High();
  205. E1_Low();
  206. }
  207. R_W_Low();
  208. A0_High();
  209. P4OUT = nVal;
  210. //写入指令
  211.     if(nZone == 0)
  212. {
  213. //E1区
  214. E1_Low();
  215. }
  216. else
  217. {
  218. //E2区
  219. E2_Low();
  220. }
  221. R_W_High();
  222. return;
  223. }
  224. void DisplayOn(int nZone)
  225. {
  226. char nTemp;
  227. for(;;)
  228. {
  229. //发送显示开命令
  230. SendCommand(nZone,0xAF);
  231. WaitIdle(nZone);
  232. //读状态
  233. //设置为输入方向
  234. P4DIR = 0x00;
  235. if(nZone == 0)
  236. {
  237. //E1区
  238.             E1_High();
  239. E2_Low();
  240. }
  241. else
  242. {
  243. //E2区
  244. E2_High();
  245. E1_Low();
  246. }
  247. R_W_High();
  248. A0_Low();
  249. //取出D5
  250. nTemp = (P4IN & BIT5);
  251. nTemp >>= 5;
  252. //如果打开就跳出循环
  253. if(nTemp == 0) break;
  254. }
  255. return;
  256. }
  257. void DisplayOff(int nZone)
  258. {
  259. char nTemp;
  260. for(;;)
  261. {
  262. //发送显示开命令
  263. SendCommand(nZone,0xAE);
  264. WaitIdle(nZone);
  265. //读状态
  266. //设置为输入方向
  267. P4DIR = 0x00;
  268. if(nZone == 0)
  269. {
  270. //E1区
  271.             E1_High();
  272. E2_Low();
  273. }
  274. else
  275. {
  276. //E2区
  277. E2_High();
  278. E1_Low();
  279. }
  280. R_W_High();
  281. A0_Low();
  282. //取出D5
  283. nTemp = (P4IN & BIT5);
  284. nTemp >>= 5;
  285. //如果打开就跳出循环
  286. if(nTemp == 1) break;
  287. }
  288. return;
  289. }
  290. void ClearScreen(int nZone)
  291. {
  292. int i,j;
  293. char nPageNum;
  294. //设置页地址代码
  295. nPageNum = 0xB8;
  296. for(i = 0;i < 4;i++)
  297. {
  298. SendCommand(nZone,0x00);
  299. for(j = 0;j < 80;j++)
  300. {
  301. //等待闲
  302. WaitIdle(nZone);
  303. //写入0x00以清屏
  304. WriteData(nZone,0x00,j);
  305. }
  306. //页地址增加
  307. nPageNum += 1;
  308. }
  309.     return;
  310. }
  311. void LcdDisplayInit(int nZone)
  312. {
  313. char nCommand;
  314. //关显示
  315. DisplayOff(nZone);
  316. //静态显示驱动
  317. nCommand = 0xA4;
  318. SendCommand(nZone,nCommand);
  319. //占空比设置
  320. nCommand = 0xA9;
  321. SendCommand(nZone,nCommand);
  322. //复位
  323. nCommand = 0xE2;
  324. SendCommand(nZone,nCommand);
  325. //ADC选择
  326. nCommand = 0xA0;
  327. SendCommand(nZone,nCommand);
  328. //清屏
  329. ClearScreen(nZone);
  330. //开显示
  331. WaitIdle(nZone);
  332. DisplayOn(nZone);
  333. return;
  334. }
  335. void LcdDisplayWord(int nZone,char nRow,char nPageNo,char nColAddr,char nTable[])
  336. {
  337. int i;
  338. char nTemp;
  339. //设置行地址
  340. SendCommand(nZone,nRow);
  341. //设置页地址
  342. SendCommand(nZone,nPageNo);
  343. //显示前8行
  344. for(i = 0;i < 16;i++)
  345. {
  346. nTemp = nTable[i];
  347. WriteData(nZone,nTemp,i);
  348. }
  349. nPageNo += 1;
  350. //设置页地址
  351. SendCommand(nZone,nPageNo);
  352. //显示后8行
  353. for(i = 0;i < 16;i++)
  354. {
  355. nTemp = nTable[i + 16];
  356. WriteData(nZone,nTemp,i);
  357. }
  358. return;
  359. }